import { ColumnProps } from '@/components/ProTable/interface';
import * as XLSX from 'xlsx';

interface OtherDataProp {
  sheetName?: string;
  wch?: number | Array<number>;
}

export function exportExcel(exportData: any[], columns: any[], exportName: string, otherData?: OtherDataProp) {
  const setHeader = (columns: ColumnProps[], ws: any) => {
    let headerGs: any = {};
    for (let head of columns) {
      headerGs[head.prop] = head.label;
    }

    // 替换表头（这里需要稍微修改逻辑，因为json_to_sheet生成的是基于key的列名）
    const ws_range = XLSX.utils.decode_range(ws['!ref']);
    for (let C = ws_range.s.c; C <= ws_range.e.c; ++C) {
      const cell_ref = XLSX.utils.encode_col(C) + '1'; // 假设表头在第一行
      if (ws[cell_ref]) {
        const headerKey = ws[cell_ref].s ? ws[cell_ref].s.cell.v : ws[cell_ref].v || ''; // 尝试从样式或值中获取键名
        const headerValue = headerGs[headerKey] || headerKey; // 如果映射存在，则使用映射值，否则使用原始键名
        ws[cell_ref].v = headerValue; // 设置新的表头值

        // 假设我们想要根据列名或映射后的值来设置列宽（这里只是示例）
        // 注意：这里的列宽是字符宽度单位，Excel中默认字体（Calibri 11）大约相当于256/20 = 12.8像素
        // 假设第一列需要更宽的宽度
        if (!ws['!cols']) ws['!cols'] = [];
        if (typeof otherData?.wch === 'number') {
          ws['!cols'].push({ wch: otherData.wch }); // 设置第一列的宽度为20个字符宽度
        } else {
          let f_wch = 10;
          ws['!cols'].push({ wch: otherData?.wch[C] || f_wch }); //
        }
      }
    }
    return headerGs;
  };

  const setTableData = (data: any[], columns: ColumnProps[]) => {
    let newTableData = [];
    for (let item of data) {
      let newItem = {};
      for (let head of columns) {
        if (head.enum) {
          let arr: any = head.enum;
          newItem[head.prop] = arr.find((e: any) => {
            return e.value == item[head.prop];
          })?.label;
        } else {
          newItem[head.prop] = item[head.prop];
        }
      }
      newTableData.push(newItem);
    }
    return newTableData;
  };

  // 下载excel
  const _dowloadExcel = () => {
    let col = columns.filter(item => item.prop !== 'operation');

    const tableData = setTableData(exportData, col); // 假设这是你的数据处理函数
    const ws = XLSX.utils.json_to_sheet(tableData); // 创建工作表
    const wb = XLSX.utils.book_new(); // 创建工作簿

    setHeader(col, ws); // 假设这是你的表头映射函数

    XLSX.utils.book_append_sheet(wb, ws, otherData?.sheetName || 'Sheet1'); // 添加工作表到工作簿
    XLSX.writeFile(wb, exportName + '.xlsx'); // 导出文件
  };
  _dowloadExcel();
}
